2018年07月27日

本日の内容

  1. 効率的で綺麗な可視化(60~90分程度)
    • 整然データ(tidy data)とは?(復習)
    • 可視化の重要性
    • ggplot2とは?
    • ggplot2の基本
      • 散布図
      • ヒストグラム
      • 箱ひげ図
    • 復習のためのリソース
  2. 演習1~5(残り)

効率的で綺麗な可視化

【復習】整然データとは?

可視化の重要性

  • 下の散布図は全て同じ統計量!
    • 数字を眺めてるだけでは判断を間違う可能性がある
    • 分析の最初には必ずデータの分布を確認する癖をつける

ggplot2とは?

  • Create Elegant Data Visualisations Using the Grammar of Graphics
    • 文字通り統一された文法で様々なグラフを描けるパッケージ
    • tidyverseシリーズなので整然データを前提とした設計
    • といっても現時点ではパイプ演算子(%>%)は使えません
  • 特徴
    • GIS(地理情報システム)などと同じレイヤー構造
    • ggplot2::aes(エステティック・マッピング)という考え方
    • 出来ないないことは関連パッケージで補える柔軟性
      • QQプロットはqqplotr, 格子配置はggExtra, etc
    • 忖度してくれない(とりあえずでデータを突っ込んでも描画はしない)
      • base plotはとりあえずで突っ込んでも何か描いてくれる

必要なデータ形式

  • ggplot2はデータフレーム型のデータを第一引数に取ります
  • 第一引数内にX軸用データ、Y軸用データ、グループ化データの三項目が必要です(当然、描くグラフにより変わります)
  x y group, colour, fill, …
1 X軸用データ Y軸用データ グループ化データ
2 X軸用データ Y軸用データ グループ化データ
3

 
つまり、整然データ(tidy data)が必要

ggplot2の基本

利用するデータ

iris

irisとは?

アイリス(ギリシャ語のイリスに由来)とはアヤメ科アヤメ属の多年草。花は三個の花弁(内花、Petal)と三個の萼片(外花、Sepal)から構成される。Setosaの和名はヒオウギアヤメ、Versicolor、Virginicaはカキツバタに分類されるらしい。iris datasetはフィッシャーの線形判別分析に用いられたデータ(irisの正体)。

http://suruchifialoke.com/2016-10-13-machine-learning-tutorial-iris-classification/

散布図

二変数の関係を把握する

ヒストグラム

データの値の度数分布を把握する

箱ひげ図

統計量(五数要約)を視覚的に把握する(分布がつかみにくいのでドットチャートとの併用やヴァイオリンプロットが使われることも多い)

散布図基本編

座標を指定する(ベース座標のレイヤーを作る)

iris %>% ggplot(aes(x = Sepal.Width, y = Sepal.Length))

散布図を重ねる(レイヤーを重ねる)

iris %>% ggplot(aes(x = Sepal.Width, y = Sepal.Length)) +
  geom_point()

散布図に回帰直線を重ねる(レイヤーを重ねる)

iris %>% ggplot(aes(x = Sepal.Width, y = Sepal.Length)) +
  geom_point() + geom_smooth(method = "lm", se = FALSE)

散布図応用編

散布図を層別にする

ggplot(iris, aes(x = Sepal.Width, y = Sepal.Length)) +
  geom_point(aes(colour = Species))

層別散布図に回帰直線を重ねる(あれ?)

ggplot(iris, aes(x = Sepal.Width, y = Sepal.Length)) +
  geom_point(aes(colour = Species)) + geom_smooth(method = "lm", se = FALSE)

ポイントはggplot2::aes関数の指定位置

ggplot(iris, aes(x = Sepal.Width, y = Sepal.Length, colour = Species)) +
  geom_point() + geom_smooth(method = "lm", se = FALSE)

geom_point関数にしか作用しない

ggplot(iris, aes(x = Sepal.Width, y = Sepal.Length)) +
  geom_point(aes(colour = Species)) + geom_smooth(method = "lm", se = FALSE)

geom_smooth関数にしか作用しない

ggplot(iris, aes(x = Sepal.Width, y = Sepal.Length)) +
  geom_point() + geom_smooth(aes(colour = Species), method = "lm", se = FALSE)

aes関数の影響範囲

  • ベース座標(ggplot関数)で指定したaes関数のパラメータは全てのレイヤー(geom_関数)に対して有効
ggplot(iris, aes(x = Sepal.Width, y = Sepal.Length, colour = Species)) +
  geom_point() + geom_smooth(method = "lm", se = FALSE)

 

  • 各レイヤー(geom_関数)で指定したaes関数のパラメータは各レイヤー(geom_関数)内のみで有効
ggplot(iris, aes(x = Sepal.Width, y = Sepal.Length)) +
  geom_point() + geom_smooth(aes(colour = Species), method = "lm", se = FALSE)

ヒストグラム基本編

座標を指定する(ベースのレイヤーを作る)

iris %>% ggplot(aes(x = Petal.Length))

ヒストグラムを重ねる

iris %>% ggplot(aes(x = Petal.Length)) + 
  geom_histogram()

ヒストグラム応用編

ヒストグラムを層別にする - stack

ggplot(iris, aes(x = Petal.Length, fill = Species)) + 
  geom_histogram(alpha = 0.5)                         # position = "stack"

層別(色別)ヒストグラム

ggplot(iris, aes(x = Petal.Length, fill = Species)) + 
  geom_histogram(position = "identity", alpha = 0.5)

密度推定を重ねる

ggplot(iris, aes(x = Petal.Length, fill = Species)) + 
  geom_histogram(aes(y = ..density..), position = "identity", alpha = 0.5) +
  geom_density(colour = "darkgray", alpha = 0.25)

階級の計算方法

ggplot2::geom_histogram関数のデフォルト設定では階級数が30に固定されています。階級数(または階級幅)を一意に決める方法はありませんが、Rではpritty関数を用いることで適切な階級(数、幅)を求めることができます。

pretty(x, n)

 

引数 説明
x ヒストグラムを描くためのデータ(ベクトル型)
n ヒストグラムの分割数(通常はスタージェスの公式[nclass.Sturges(x)]などで求める)

 
注)cut関数は値がどの階級に含まれるかを調べる関数

階級を指定する

breaks <- with(iris, pretty(Petal.Length, nclass.Sturges(Petal.Length)))
ggplot(iris, aes(x = Petal.Length, fill = Species)) + 
  geom_histogram(breaks = breaks, position = "identity", alpha = 0.5)

箱ひげ図基本編

座標を指定する(ベースのレイヤーを作る)

iris %>% ggplot(aes(x = Species, y = Sepal.Length))

箱ひげ図を重ねる

iris %>% ggplot(aes(x = Species, y = Sepal.Length)) +
  geom_boxplot()

箱ひげ図応用編

層別(色別)箱ひげ図

ggplot(iris, aes(x = Species, y = Sepal.Length)) +
  geom_boxplot(aes(colour = Species))

層別(色別)箱ひげ図

ggplot(iris, aes(x = Species, y = Sepal.Length)) +
  geom_boxplot(aes(fill = Species), alpha = 0.5)

層別(色別)箱ひげ図

ggplot(iris, aes(x = Species, y = Sepal.Length)) +
  geom_boxplot(aes(colour = Species, fill = Species), alpha = 0.5)

箱ひげ図は基本的に層別で使う

ggplot(iris, aes(x = NA, y = Sepal.Length)) +
  geom_boxplot()

頻度分布を重ねる

ggplot(iris, aes(x = Species, y = Sepal.Length, colour = Species)) +
  geom_boxplot() + geom_dotplot(binaxis = "y", stackdir = "up", dotsize = 0.75)

より見やすく

層別グラフを個別に描くfacet_*関数

ggplot(iris, aes(x = Sepal.Width, y = Sepal.Length)) + facet_wrap(~ Species)

グラフを重ねることも可能

ggplot(iris, aes(x = Sepal.Width, y = Sepal.Length)) + facet_wrap(~ Species) + 
  geom_point() + geom_smooth(method = "lm", se = FALSE)

色の有効範囲は同じ

ggplot(iris, aes(x = Sepal.Width, y = Sepal.Length, colour = Species)) +
  geom_point() + geom_smooth(method = "lm", se = FALSE) + facet_wrap(~ Species)

散布図だけ色別

ggplot(iris, aes(x = Sepal.Width, y = Sepal.Length)) + facet_wrap(~ Species) +
  geom_point(aes(colour = Species)) + geom_smooth(method = "lm", se = FALSE)

回帰直線だけ色別

ggplot(iris, aes(x = Sepal.Width, y = Sepal.Length)) + geom_point() +
  facet_wrap(~ Species) + geom_smooth(aes(colour = Species), method = "lm", se = FALSE) 

より分かりやすく

# ggplot(iris, aes(Sepal.Width, fill = Species)) + facet_wrap(~ Species) + 
#     geom_histogram(position = "identity", alpha = 0.75) + gghighlight::gghighlight()

その他の描画関数

geom object 描画内容 類似object
geom_abline 参照線 geom_hline, geom_vline
geom_bar 棒グラフ geom_col
geom_errorbar エラーバー geom_crossbar
geom_line 折れ線グラフ geom_path
geom_rug ラグプロット
geom_text テキストラベル geom_label
geom_violin バイオリンプロット

まとめ

ggplot2を使うためのポイント

ggplot(data = df,                     # 描画するデータセット(tidy data)を指定
       mapping = aes(x, y,            # グラフ軸とデータの対応を指定
                     colour, ...)) +  # 色(グループ)とデータの対応を指定
  geom_point(...) +                   # 描画するグラフを指定
  geom_smooth(...) +                  # 重ね合わせるグラフを指定
  ...                                 # その他、軸や背景などのグラフ要素を指定

ggplot2パッケージを用いる場合には、描画対象となるデータを含んだデータセット(tidy data)が必要です。なので、dplyrパッケージやtidyrパッケージを駆使してデータセットをいかに作るかが最初のポイントになります。

データセットを指定したら各座標に割り当てるデータやグルーピングするためのデータなどを指定します。どのようなグラフでも指定方法はggplot2の文法にしたがいます。なので、エステティック関数(aes)の使い方が二つ目のポイントになります。(最新版チートシート

復習のためのリソース

License

CC BY-NC-SA 4.0, Sampo Suzuki